package f_Collectors类.toMap方法的使用;

import z_Entity.User;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * Collectors类的 toMap方法的使用
 * 作用：将集合转成map
 *
 * @author xuyaxu
 * @date 2022/8/8 22:48
 */
public class ToMapDemo {
    public static void main(String[] args) {
        List<User> userList = User.getUserList();

        // 1. 使用 toMap(Function, Function) 将list转成以id为key的map，value是id对应的user对象
        Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

        // 2. 加入 id 存在重复值，则会报错Duplicate key xxx, 解决方案是：
        // 只取后一个key及value
        Map<Integer, User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (oldValue, newValue) -> newValue));
        // 只取前一个key及value
        Map<Integer, User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (oldValue, newValue) -> oldValue));

        // 3. 想获得一个id和name对应的Map<String, String>
        Map<Integer, String> idUserNameMap = userList.stream().collect(Collectors.toMap(User::getId, User::getUserName));
        // 注意：name可以为空字符串但不能为null，否则会报空指针，解决方案：
        Map<Integer, String> idUserNameMap2 = userList.stream().collect(Collectors.toMap(User::getId, e -> e.getUserName() == null ? "" : e.getUserName()));
        // 假如存在id重复，两个value可以这样映射到同一个id：
        Map<Integer, String> idUserNameMap3 = userList.stream().collect(Collectors.toMap(User::getId, User::getUserName, (e1, e2) -> e1 + "," + e2));
    }
}
